package cz.uhk.ppro.services;


import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.transaction.annotation.Transactional;

import cz.uhk.ppro.entities.Dil;
import cz.uhk.ppro.entities.Dodavatel;

/***
 * 
 * Zprostředkovává databázovou práci s díly
 *
 */

@Transactional
public class DilDbService {
	@PersistenceContext
	EntityManager em;
	
	public void naskladnit(Dil dil, int pocet, float cenaKc, float cenaEur, float cenaUsd){
		/**
		 * naskladnění
		 * vstupní parametry - díl který naskladňujeme, počet kusů k naskladnění a cena dílu v různých měnách
		 */
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("stavostroj");
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();
			System.out.println(pocet);
			dil.setPocetKusu(dil.getPocetKusu()+pocet);
			dil.setCenaKc(dil.getCenaKc()+cenaKc);
			dil.setCenaEur(dil.getCenaEur()+cenaEur);
			dil.setCenaUsd(dil.getCenaUsd()+cenaUsd);
			em.merge(dil);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}
	
	public void precenit(float cenaKc, float cenaEur, float cenaUsd, Dil dil){
		/**
		 * přecenění - parametry díl a jeho ceny
		 */
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("stavostroj");
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();
			dil.setCenaKc(cenaKc);
			dil.setCenaEur(cenaEur);
			dil.setCenaUsd(cenaUsd);
			em.merge(dil);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}
	
	public void vyskladnit(Dil dil, int pocet, float cenaKc, float cenaEur, float cenaUsd){
		/**
		 * vyskladnění
		 * vstupní parametry - díl který vyaskladňujeme, počet kusů k vyskladnění a cena dílu v různých měnách
		 */
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("stavostroj");
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();
			System.out.println(pocet);
			dil.setPocetKusu(dil.getPocetKusu()-pocet);
			dil.setCenaKc(dil.getCenaKc()-cenaKc);
			dil.setCenaEur(dil.getCenaEur()-cenaEur);
			dil.setCenaUsd(dil.getCenaUsd()-cenaUsd);
			em.merge(dil);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}
	
	public void pridej (Dil dil){
		/**
		 * přidá
		 * parametrem díl s nastaveným dodavatelem
		 */
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("stavostroj");
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();
			em.persist(dil);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}
	
	public void uprav(Dil dil, String katCislo,String nazev,String pozn, Dodavatel dod){
		/**
		 * upraví parametry a dodavatele dílu
		 * parametry parametry a dodavatel dílu
		 */
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("stavostroj");
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();
			dil.setKatalogoveCislo(katCislo);
			dil.setNazev(nazev);
			dil.setPoznamka(pozn);
			dil.setDodavatel(dod);
		em.merge(dil);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}
	
	public void smaz (Dil dil){
		/**
		 * Smaže díl z databáze
		 */
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("stavostroj");
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();  
		  em.remove(em.find(Dil.class, dil.getId()));
		em.getTransaction().commit();
		em.close();
		emf.close();
	}
	
	public List<Dil> vypis (){
		/**
		 * Vypíše všechny díly
		 */
		@SuppressWarnings("unchecked")
		List<Dil> dily = em.createQuery("from Dil").getResultList();
		return dily;
	}
	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public List<Object[]> vypisKriteria (String query, Map params){
		/**
		 * Vypíše díly dle zadaných kritérií
		 */
		Query qr = em.createQuery(query);
			
		Iterator iter = params.keySet().iterator();
	    while (iter.hasNext()) {
	    	String name = (String) iter.next();
	        Object value = params.get(name);
	        qr.setParameter(name,value);
	     }
	    
		return qr.getResultList();
	}
	
	public Dil vrat (int id) {
		/**
		 * Vrátí díl s daným id
		 */
			Dil dil = em.find(Dil.class, id);
		return dil;
	}
}
